<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
    <link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/animate.css/4.1.1/animate.compat.css">

</head>
<style>
    .marsk {
        background-color: rgba(0, 0, 0, .5);
        position: fixed;
        top: 0;
        bottom: 0;
        left: 0;
        right: 0;
        display: flex;
        justify-content: center;
        align-items: center;
    }

    .modal-wrap {
        border-radius: 10px;
        background-color: #fff;
        width: 300px;
        display: flex;
        align-items: center;
        justify-content: center;
        flex-direction: column;
    }

    .marsk .title,
    .marsk .footer,
    .marsk .body {
        margin: 20px 0;
    }

    button {
        outline: none;
        border: 0;
        width: 150px;
        height: 30px;
        background: linear-gradient(90deg, #126bb0, #162e9c);
        border-radius: .28571429rem;
        display: block;
        color: #fff;
        cursor: pointer;
    }
</style>

<body>
    <div id="app">
        <button @click="showModal=true">打开模态框</button>
        <modal :visible="showModal" @on-confirm="confirm"></modal>
    </div>

    <template id="modal">
        <div class="marsk" v-if="visible" key="div">
            <div class="modal-wrap">
                <div class="title">提示</div>
                <div class="body">提示内容</div>
                <div class="footer">
                    <button @click="confirm">点击确定</button>
                </div>
            </div>
        </div>
    </template>

    <script>
        Vue.component("modal", {
            template: "#modal",
            props: {
                visible: {
                    type: Boolean,
                    default() {
                        return false
                    }
                }
            },
            methods: {
                confirm() {
                    this.$emit("on-confirm")
                }
            }
        })
        let vm = new Vue({
            el: "#app",
            data: {
                showModal: false
            },
            methods: {
                confirm() {
                    this.showModal = false
                }
            }
        })
    </script>

</body>

</html>